home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / c / stut_src / usltp.c < prev    next >
Text File  |  1996-05-27  |  13KB  |  559 lines

  1. /*
  2.  * USLTP.c
  3.  *
  4.  * Purpose:
  5.  * --------
  6.  * Impl‚mentation multitache coop‚ratif de
  7.  * Universal Serial Link Transfer Protocol
  8.  *
  9.  * History:
  10.  * --------
  11.  * 12.04.95: fplanque: Created
  12.  */
  13.  
  14.  
  15.      #include "!OPTIONS.H"                /* Options de compilation */         
  16.     #define    THIS_FILE    "USLTP.C v1.00 - 05.95"
  17.           
  18.  
  19. /*
  20.  * System headers:
  21.  */
  22.     #include    <stdio.h>
  23.     #include <string.h>
  24.     
  25. /*
  26.  * Custom headers:
  27.  */
  28.     #include "USLTP.H"
  29.     #include "SERVEUR.H"
  30.     #include "S_MALLOC.H"
  31.     #include "SPEC_PU.H"
  32.     #include "DEBUG_PU.H"
  33.     #include "TEXT_PU.H"
  34.     #include "TERM_PU.H"
  35.     #include "GETKB_PU.H"    
  36.  
  37. /*
  38.  * Constantes priv‚es:
  39.  */
  40. typedef
  41.     enum
  42.     {
  43.         USLTP_WAITING,                    /* En attente de r‚ponse (n‚cessaire pour multitƒche coop‚ratif) */
  44.         USLTP_OK,                        
  45.         USLTP_UNEXPECTED_MSG,        /* La r‚ponse ne correspond pas … ce qu'on attendait */
  46.         USLTP_TIMEOUT,                    /* On a attendu trop longtemps sans r‚ponse... */
  47.         USLTP_LINE_ABORT,
  48.         USLTP_LOCAL_ABORT,
  49.         USLTP_EXIT,
  50.         USLTP_LOGICAL_HUP,            /* Logical Hang-Up (Appui sur cnx fin) */
  51.         USLTP_PHYSICAL_HUP            /* Physical Hang-Up (Double-appui) */
  52.     }
  53.     USLTP_RCODE;    
  54.  
  55.  
  56. #define    URCV_PRECISELY            0x0001    
  57. #define    URCV_SINGLETRY            0x0002
  58.  
  59. #define    USLTP_RCV_ACQ_BUF        128
  60.  
  61. #define    USLTP_RETRY_DELAY        5        /* 5 Secondes */
  62. #define    USLTP_TIMEOUT            30        /* 30 Secondes */
  63.  
  64. /*
  65.  * ------------------------ PROTOTYPES -------------------------
  66.  */
  67.  
  68. /*
  69.  * PRIVate INTernal prototypes:
  70.  */
  71. void USLTP_Send_Start(
  72.             USLTP_CTRLBLK * pUCtl );    /* In: Block de controle session USLTP */
  73. USLTP_RCODE USLTP_Send_WaitLoad(
  74.             USLTP_CTRLBLK * pUCtl );    /* In: Block de controle session USLTP */
  75. USLTP_RCODE USLTP_Send_WaitReady(
  76.             USLTP_CTRLBLK * pUCtl );    /* In: Block de controle session USLTP */
  77. USLTP_RCODE USLTP_Send_AcqClass(
  78.             USLTP_CTRLBLK * pUCtl );    /* In: Block de controle session USLTP */
  79.  
  80. /* ---- */
  81.  
  82. USLTP_RCODE USLTP_ReceiveCmd(
  83.         USLTP_CTRLBLK    *    pUCtl,        /* In: Block de controle session USLTP */
  84.         const char         *    cpsz_what,    /* In: Ce qu'on veut recevoir */
  85.         int                    n_timeout,    /* In: Timeout en secondes */
  86.         int                    flags );        /* In: Flags de fonctionnement */
  87.  
  88.  
  89. /*
  90.  * ------------------------ FUNCTIONS -------------------------
  91.  */
  92.  
  93. /*
  94.  * USLTP_Init(-)
  95.  *
  96.  * Purpose:
  97.  * --------
  98.  * Initialisation d'une session USLTP
  99.  * (Cr‚e les params n‚cessaires … USLTP)
  100.  *
  101.  * Note:
  102.  * -----
  103.  * Modifie des trucs dans la VOIE courante (sp‚cifique … STUT ONE)
  104.  *
  105.  * History:
  106.  * --------
  107.  * 12.04.95: fplanque: Created
  108.  * 12.07.95: m‚morise la voie concern‚e
  109.  */
  110. USLTP_CTRLBLK * USLTP_Session_Open(            /* Out: Block de controle */
  111.                 int                n_InDev,            /* In:  device d'entr‚e */
  112.                 int                n_OutDev,        /* In:  device de sotie */
  113.                 char            *    psz_FileName,    /* In:  Path du Fichier … envouyer */
  114.                 VOIE            *    pVoie,            /* In:  voie concern‚e */
  115.                 WIPARAMS     *    pWiParams)        /* In:  Fen de log */
  116. {
  117.     /*
  118.      * Cr‚ation d'une zone de contr“le du t‚l‚chargement en cours...
  119.      */
  120.     USLTP_CTRLBLK * pUCtl = MALLOC( sizeof( USLTP_CTRLBLK ) );    
  121.     pUCtl -> State                = USTATE_INIT;
  122.     pUCtl -> n_InDev            = n_InDev; 
  123.     pUCtl -> n_OutDev            = n_OutDev; 
  124.     pUCtl -> pVoie                = pVoie;
  125.     pUCtl -> psz_FileName    = psz_FileName;
  126.     pUCtl -> pRcvAcqBuf        = TextLine_CreateStandAlone( USLTP_RCV_ACQ_BUF );
  127.     pUCtl -> pWiParams        = pWiParams;
  128.     pUCtl -> clock_timeout    = -1;        /* Pas de Timeout enclench‚ */
  129.  
  130.     /*
  131.      * Allocation d'un buffer de r‚ception:
  132.      */
  133.     TextLine_Clear( pUCtl -> pRcvAcqBuf );
  134.     pVoie -> curr_textline = pUCtl -> pRcvAcqBuf;
  135.     
  136.     return pUCtl;
  137. }
  138.  
  139.  
  140. /*
  141.  * USLTP_Session_Process(-)
  142.  *
  143.  * Purpose:
  144.  * --------
  145.  * Dispatche les action de la session
  146.  * en fonction de l'‚tat courant
  147.  *
  148.  * History:
  149.  * --------
  150.  * 12.04.95: fplanque: Created
  151.  * 12.07.95: fplanque: gestion des xx_HUP, renvoi de codes xx_HUP
  152.  */
  153. USLTP_PROCESS USLTP_Session_Process(            /* Out: Etat de la session (continue, fin, fin_cnx) */
  154.                             USLTP_CTRLBLK * pUCtl )    /* In:  Block de controle session USLTP */
  155. {
  156.     USLTP_RCODE URCode = USLTP_WAITING;    /* Par d‚faut */
  157.  
  158.     switch( pUCtl -> State )
  159.     {
  160.         case    USTATE_INIT:
  161.             USLTP_Send_Start( pUCtl );
  162.             break;
  163.  
  164.         case    USTATE_WAIT_LOAD:
  165.             URCode = USLTP_Send_WaitLoad( pUCtl );
  166.             break;
  167.  
  168.         case    USTATE_SYNC:
  169.             URCode = USLTP_Send_WaitReady( pUCtl );
  170.             break;
  171.  
  172.         case    USTATE_CLASS:
  173.             URCode = USLTP_Send_AcqClass( pUCtl );
  174.             break;
  175.  
  176.     
  177.         default:
  178.             /*
  179.              * Erreur, on ne sait pas traiter
  180.              */
  181.             signale( "USLTP error: unknown state" );
  182.             return UPROCESS_END;
  183.     }
  184.     
  185.     switch( URCode )
  186.     {
  187.         case    USLTP_UNEXPECTED_MSG:
  188.             add_textinf( pUCtl -> pWiParams, "  Message USLTP inattendu / Erreur protocole!" );
  189.             return UPROCESS_END;            
  190.             
  191.         case    USLTP_TIMEOUT:
  192.             add_textinf( pUCtl -> pWiParams, "  Timeout USLTP!" );
  193.             return UPROCESS_END;            
  194.  
  195.         case USLTP_LINE_ABORT:
  196.             add_textinf( pUCtl -> pWiParams, "  Arret utilisateur!" );
  197.             return UPROCESS_END;            
  198.  
  199.         case USLTP_LOCAL_ABORT:
  200.             add_textinf( pUCtl -> pWiParams, "  Arret serveur!" );
  201.             return UPROCESS_END;            
  202.  
  203.         case USLTP_EXIT:
  204.             add_textinf( pUCtl -> pWiParams, "  Fin de session USLTP." );
  205.             return UPROCESS_END;            
  206.  
  207.         case USLTP_LOGICAL_HUP:
  208.             add_textinf( pUCtl -> pWiParams, "  D‚connexion logique (Cnx/Fin)!" );
  209.             return UPROCESS_LOGICAL_HUP;            
  210.  
  211.         case USLTP_PHYSICAL_HUP:
  212.             add_textinf( pUCtl -> pWiParams, "  D‚connexion physique!" );
  213.             return UPROCESS_PHYSICAL_HUP;            
  214.     }
  215.  
  216.     return    UPROCESS_CONTINUE;
  217. }
  218.  
  219.  
  220.  
  221. /*
  222.  * USLTP_Session_Close(-)
  223.  *
  224.  * Purpose:
  225.  * --------
  226.  * Ferme une session
  227.  *
  228.  * Note:
  229.  * -----
  230.  * Modifie des trucs dans la VOIE courante (sp‚cifique … STUT ONE)
  231.  *
  232.  * History:
  233.  * --------
  234.  * 12.04.95: fplanque: Created
  235.  * 13.07.95: fplanque: libŠre le tampon de r‚ception
  236.  */
  237. void USLTP_Session_Close(    
  238.             USLTP_CTRLBLK * pUCtl )    /* In:  Block de controle session USLTP */
  239. {
  240.     VOIE * pVoie = (VOIE *)(pUCtl -> pVoie);
  241.  
  242.     /*
  243.      * LibŠre tampon de r‚ception:
  244.      */
  245.     delete_line( pVoie -> curr_textline, NULL );
  246.  
  247.     /*
  248.      * LibŠre zone de contr“le du transfert
  249.      */
  250.     FREE( pUCtl );
  251.     
  252. }
  253.  
  254.  
  255. /*
  256.  * ------------------------ Routines Internes ---------------------------
  257.  */
  258.  
  259.  
  260. /*
  261.  * USLTP_Send_Start(-)
  262.  *
  263.  * Purpose:
  264.  * --------
  265.  *
  266.  * History:
  267.  * --------
  268.  * 12.04.95: fplanque: Created
  269.  */
  270. void USLTP_Send_Start(
  271.             USLTP_CTRLBLK * pUCtl )    /* In: Block de controle session USLTP */
  272. {
  273.     add_textinf( pUCtl -> pWiParams, "  Activation USLTP (Server)" );
  274.     str_conout( pUCtl -> n_OutDev, "\x0DUSLTP/START\x0D" );
  275.  
  276.     add_textinf( pUCtl -> pWiParams, "   Attente Loader..." );
  277.     pUCtl -> State = USTATE_WAIT_LOAD;
  278.     str_conout( pUCtl -> n_OutDev, "\x0DUSLTP/SERV\x0D" );
  279.     pUCtl -> clock_timeout    = -1;        /* Pas de Timeout enclench‚ */
  280. }
  281.  
  282.  
  283. /*
  284.  * USLTP_Send_WaitLoad(-)
  285.  *
  286.  * Purpose:
  287.  * --------
  288.  * Attend que le loader se manifeste
  289.  *
  290.  * History:
  291.  * --------
  292.  * 12.04.95: fplanque: Created
  293.  * 08.10.95: fplanque: Termin‚
  294.  */
  295. USLTP_RCODE USLTP_Send_WaitLoad(
  296.             USLTP_CTRLBLK * pUCtl )    /* In: Block de controle session USLTP */
  297. {
  298.     USLTP_RCODE URCode;
  299.     
  300.     URCode = USLTP_ReceiveCmd( pUCtl, "USLTP/LOADER", USLTP_RETRY_DELAY, URCV_PRECISELY );
  301.  
  302.     switch( URCode )
  303.     {
  304.         case    USLTP_OK:
  305.             /*
  306.              * Le LOADER a signal‚ sa pr‚sence:
  307.              */
  308.             add_textinf( pUCtl -> pWiParams, "   Synchronisation..." );
  309.             pUCtl -> State = USTATE_SYNC;
  310.             str_conout( pUCtl -> n_OutDev, "\x0DUSLTP/SYNC\x0D" );
  311.             /*
  312.              * Initialise le buffer de r‚ception:
  313.              */
  314.             TextLine_Clear( pUCtl -> pRcvAcqBuf );
  315.             pUCtl -> clock_timeout    = -1;        /* Reset TIMEOUT */
  316.             break;
  317.             
  318.         case    USLTP_TIMEOUT:
  319.             /*
  320.              * On est en phase d'attente du LOADER:
  321.              * A chaque timeout (c'est le cas ici) on renvoie une
  322.              * s‚quence d'identification USLTP/SERV et on enclenche
  323.              * un nouveau TIMEOUT.
  324.              */
  325.             add_textinf( pUCtl -> pWiParams, "   Recommence attente Loader..." );
  326.             str_conout( pUCtl -> n_OutDev, "\x0DUSLTP/SERV\x0D" );
  327.             pUCtl -> clock_timeout    = -1;        /* Reset TIMEOUT */
  328.             return    USLTP_WAITING;
  329.     }
  330.  
  331.     return    URCode;
  332. }            
  333.  
  334.  
  335.  
  336. /*
  337.  * USLTP_Send_WaitReady(-)
  338.  *
  339.  * Purpose:
  340.  * --------
  341.  * On a envoy‚ USLTP/SYNC
  342.  * On attend USLTP/READY de la part du loader
  343.  *
  344.  * History:
  345.  * --------
  346.  * 08.10.95: fplanque: Created
  347.  */
  348. USLTP_RCODE USLTP_Send_WaitReady(
  349.             USLTP_CTRLBLK * pUCtl )    /* In: Block de controle session USLTP */
  350. {
  351.     USLTP_RCODE URCode;
  352.     
  353.     URCode = USLTP_ReceiveCmd( pUCtl, "USLTP/READY", USLTP_TIMEOUT, URCV_PRECISELY );
  354.  
  355.     switch( URCode )
  356.     {
  357.         case    USLTP_OK:
  358.             /*
  359.              * Le LOADER a signal‚ qu'il ‚tait prˆt … recevoir:
  360.              */
  361.             add_textinf( pUCtl -> pWiParams, "   N‚gotiation du protocole..." );
  362.             pUCtl -> State = USTATE_CLASS;
  363.             str_conout( pUCtl -> n_OutDev, "?CLASS=BASE\x0D" );
  364.             /*
  365.              * Initialise le buffer de r‚ception:
  366.              */
  367.             TextLine_Clear( pUCtl -> pRcvAcqBuf );
  368.             pUCtl -> clock_timeout    = -1;        /* Reset TIMEOUT */
  369.             break;
  370.     }
  371.  
  372.     return    URCode;
  373. }            
  374.  
  375.  
  376.  
  377. /*
  378.  * USLTP_Send_AcqClass(-)
  379.  *
  380.  * Purpose:
  381.  * --------
  382.  * On a envoy‚ ?CLASS=BASE
  383.  * On attend   !CLASS=BASE:OK de la part du loader
  384.  *
  385.  * History:
  386.  * --------
  387.  * 08.10.95: fplanque: Created
  388.  */
  389. USLTP_RCODE USLTP_Send_AcqClass(
  390.             USLTP_CTRLBLK * pUCtl )    /* In: Block de controle session USLTP */
  391. {
  392.     USLTP_RCODE URCode;
  393.     
  394.     URCode = USLTP_ReceiveCmd( pUCtl, "!CLASS=BASE:OK", USLTP_TIMEOUT, URCV_SINGLETRY | URCV_PRECISELY );
  395.  
  396.     switch( URCode )
  397.     {
  398.         case    USLTP_OK:
  399.         {    /*
  400.              * Le loader a accept‚ la classe:
  401.              */
  402.             char * piBsz_filename;
  403.                     
  404.             add_textinf( pUCtl -> pWiParams, "    CLASS: BASE" );
  405.             add_textinf( pUCtl -> pWiParams, "    LEVEL: 0" );
  406.             add_textinf( pUCtl -> pWiParams, "   Envoi du nom de fichier..." );
  407.             pUCtl -> State = USTATE_FILE;
  408.         
  409.             piBsz_filename = strBchr( pUCtl -> psz_FileName, '\\' );
  410.             if( piBsz_filename )
  411.             {
  412.                 piBsz_filename++;
  413.             }
  414.             else
  415.             {
  416.                 piBsz_filename = pUCtl -> psz_FileName;
  417.             }
  418.             str_conout( pUCtl -> n_OutDev, "!FILE=" );
  419.             str_conout( pUCtl -> n_OutDev, piBsz_filename );
  420.             /*
  421.              * Initialise le buffer de r‚ception:
  422.              */
  423.             TextLine_Clear( pUCtl -> pRcvAcqBuf );
  424.             pUCtl -> clock_timeout    = -1;        /* Reset TIMEOUT */
  425.             break;
  426.         }
  427.     }
  428.  
  429.     return    URCode;
  430. }            
  431.  
  432.  
  433. /*
  434.  * ------------------------ Bas niveau ---------------------------
  435.  */
  436.  
  437. /*
  438.  * USLTP_ReceiveCmd(-)
  439.  *
  440.  * Attente de r‚ception d'une commande USLTP
  441.  * Version sp‚ciale STUT ONE (appelle get_keyboard) 
  442.  *
  443.  * 12.04.95: Created
  444.  * 17.07.95: fplanque: Gestion du timeout
  445.  */
  446. USLTP_RCODE USLTP_ReceiveCmd(
  447.         USLTP_CTRLBLK    *    pUCtl,        /* In: Block de controle session USLTP */
  448.         const char         *    cpsz_what,    /* In: Ce qu'on veut recevoir */
  449.         int                    n_timeout,    /* In: Timeout en secondes */
  450.         int                    flags )        /* In: Flags de fonctionnement */
  451. {
  452.  
  453.     KEYCODE        curr_keypress;            /* Resultat de la saisie sur voie courante */
  454.  
  455.     /*
  456.      * V‚rifie si le timeout est enclench‚:
  457.      */
  458.     if( pUCtl -> clock_timeout == -1 )
  459.     {    /*
  460.          * Il faut enclencher le Timeout:
  461.          */
  462.         pUCtl -> clock_timeout = clock() + n_timeout * CLK_TCK;
  463.  
  464.         /* printf( "\nWaiting for [%s]", cpsz_what ); */
  465.     }
  466.  
  467.     /*
  468.      * Appel de la routine de saisie:
  469.      */
  470.     curr_keypress = get_keyboard( pUCtl -> pVoie );
  471.  
  472.     /*
  473.      * Traite le r‚sultat:
  474.      */
  475.     switch( curr_keypress )
  476.     {
  477.         case    KEY_CR:
  478.             /*
  479.              * Recu un carriage return: 
  480.              * Peut etre la fin d'une commande:
  481.              */
  482.             /* printf( "\nRe‡u carriage return, msg: [%s]  ", pUCtl -> pRcvAcqBuf -> text ); */
  483.  
  484.             /*
  485.              * V‚rifie la commande/l'aquitement re‡u:
  486.              */
  487.             if( flags & URCV_PRECISELY )
  488.             {
  489.                 if( strcmp( cpsz_what, pUCtl -> pRcvAcqBuf -> text ) == 0 )
  490.                 {
  491.                     return    USLTP_OK;
  492.                 }
  493.             }
  494.             else
  495.             {
  496.                 if( strncmp( cpsz_what, pUCtl -> pRcvAcqBuf -> text, strlen(cpsz_what) ) == 0 )
  497.                 {
  498.                     return    USLTP_OK;
  499.                 }
  500.             }
  501.  
  502.             if( flags & URCV_SINGLETRY )
  503.             {    /*
  504.                  * La partie distante n'avait droit qu'… un seul essai
  505.                  * pour envoyer la bonne r‚ponse. 
  506.                  * Et elle n'a pas envoy‚ ce qu'on attendait.
  507.                  */
  508.                 return USLTP_UNEXPECTED_MSG;
  509.             }
  510.  
  511.  
  512.             /*
  513.              * Initialise le buffer de r‚ception:
  514.              */
  515.             TextLine_Clear( pUCtl -> pRcvAcqBuf );
  516.             break;
  517.             
  518.         case    KEY_SOMM:
  519.         case    KEY_ANNUL:
  520.         case    KEY_RETOUR:
  521.             /*
  522.              * Diverses touches de fonction du Minitel
  523.              * signalant que l'utilisateur d‚sire int‚rrompre 
  524.              * le t‚l‚chargement:
  525.              */
  526.             return USLTP_LINE_ABORT;
  527.  
  528.         case    KEY_FIN:
  529.             /* 
  530.              * Connexion/Fin: 
  531.              */
  532.             return    USLTP_LOGICAL_HUP;
  533.  
  534.         case    ACT_DISCONNECT:
  535.             /* 
  536.              * D‚connexion physique:
  537.              */
  538.             return    USLTP_PHYSICAL_HUP;
  539.  
  540.     
  541.     }
  542.  
  543.  
  544.     /*
  545.      * Pas re‡u de commande:
  546.      */
  547.     if( pUCtl -> clock_timeout < clock() )
  548.     {    /*
  549.          * Si le timeout est ‚coul‚:
  550.          */
  551.         return USLTP_TIMEOUT;
  552.     }
  553.     
  554.     /*
  555.      * On continue … attendre
  556.      * (mais on passe la main / multitƒche coop‚ratif)
  557.      */
  558.     return USLTP_WAITING;
  559. }